package com.jq.jqaicode.ai.workflow.notes;

import dev.langchain4j.data.message.ChatMessage;
import dev.langchain4j.data.message.SystemMessage;
import dev.langchain4j.model.chat.StreamingChatModel;
import dev.langchain4j.model.chat.request.ChatRequest;
import org.bsc.langgraph4j.action.NodeAction;
import org.bsc.langgraph4j.langchain4j.generators.StreamingChatGenerator;
import org.bsc.langgraph4j.prebuilt.MessagesState;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.util.List;
import java.util.Map;

@Component
public class VueCodeNode implements NodeAction<MessagesState<ChatMessage>> {

    @Autowired
    private StreamingChatModel streamingChatModel;

    @Override
    public Map<String, Object> apply(MessagesState<ChatMessage> chatMessageMessagesState) throws Exception {
        StreamingChatGenerator<MessagesState<ChatMessage>> generator = StreamingChatGenerator.<MessagesState<ChatMessage>>builder()
                .mapResult(response -> Map.of("messages", response.aiMessage()))
                .startingNode("vueCodeNode")
                .startingState(chatMessageMessagesState)
                .build();


        List<ChatMessage> messageList = chatMessageMessagesState.messages();

        //添加系统提示词
        SystemMessage systemMessage= SystemMessage.from("你是一位资深 Web 前端开发专家，精通 Vue 2 及其生态（如 Element-UI、vue-router 等），熟悉Vue模块化，擅长构建响应式、美观且代码整洁的单页面网站。\n" +
                "\n" +
                "你的任务是根据用户提供的需求描述自动生成一个标准的Vue2单页应用代码，注意vue项目所需的其他文件已有，只需把单页网站全部内容都生成到这个home.vue文件中。\n" +
                "\n" +
                "约束：\n" +
                "1.技术栈：使用 Vue 2、CSS 和原生 JavaScript。\n" +
                "2.第三方外部组件依赖: 只允许使用Element-UI、vue-router。\n" +
                "3.独立文件: 网站所有的内容放在`<template>`至`</template>`标签内，所有的 CSS 代码都内联在 `<style scoped>` 至 `</style>` 标签内，所有的 JavaScript 代码都放在 `<script>`至`</script>` 标签内。最终只输出一个 `home.vue` 文件\n" +
                "4.响应式设计：所有页面和组件应响应式适配，支持桌面和移动端。可使用 Element-UI/Vant 的响应式特性，也可结合 CSS Flexbox/Grid。\n" +
                "5.内容填充：如用户未描述具体内容，请用有意义的占位文本（如 Lorem Ipsum）和占位图片（如 https://picsum.photos/800/600）。\n" +
                "6.代码质量：每个文件结构清晰，变量/方法命名语义明确，适当添加代码注释。\n" +
                "7.交互性: 如果用户描述了交互功能 (如 Tab 切换、图片轮播、表单提交提示等)，请使用原生 JavaScript 来实现。\n" +
                "8.友好提示：代码生成完成会进行代码的保存和部署，在最后显示提示语：正在保存文件和部署项目中...\n" +
                "9.输出格式：每个文件以单独的 Markdown 代码块输出，并在代码块前加文件名说明，如：### home.vue\n" +
                "\n" +
                "### home.vue\n" +
                "```vue\n" +
                "... home.vue代码 ...\n" +
                "```\n" +
                "\n"+
                "正在保存文件和部署项目中...\n");

        messageList.add(0,systemMessage);

        var request = ChatRequest.builder()
                .messages(messageList)
                //.parameters(parameters)
                .build();

        streamingChatModel.chat(request, generator.handler());
        //AiMessage agentNode = AiMessage.from("我是AgentNode");
        return Map.of("_streaming_messages", generator);
    }
}
